;==================================
;头部协议区
;==================================
SECTION header vstart=0
    program_length dd program_end
    ; 程序入口
    code_entry dw start
               dd section.code.start
    realloc_tbl_len dw (header_end-segment_realloc_table)/4
    ; 程序段重定位表
    segment_realloc_table:
    code_segment dd section.code.start
    data_segment dd section.data.start
    stack_segment dd section.stack.start
    header_end:
;===================================
SECTION code align=16 vstart=0
start:
    mov ax,[stack_segment]
    mov ss, ax
    mov sp, stack_end

    mov ax,[data_segment]
    mov ds, ax

    mov cx, msg_end-message ; 循环次数
    mov bx, message         ; 起始位置
    
put_chars:
    mov ah, 0x0e  ; 0x10的0x0e命令是输出字符到屏幕，并推进光标
    mov al, [bx]  ; al为将要显示的字符
    int 0x10
    inc bx
    loop put_chars

.reps:
    mov ah, 0x00  ; 使用0x00命令
    int 0x16
    ; 中断程序读取到的字符会存储 ascii 到 al 中
    mov ah, 0x0e
    mov bl, 0x0e
    int 0x10
    jmp .reps
;===================================
SECTION data align=16 vstart=0
    message       db 'Hello, friend!',0x0d,0x0a
                  db 'This simple procedure used to demonstrate '
                  db 'the BIOS interrupt.',0x0d,0x0a
                  db 'Please press the keys on the keyboard ->'
msg_end:
;===================================
SECTION stack align=16 vstart=0
    resb 256
stack_end:
;===================================
SECTION trailer align=16
program_end: